﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace 点击按钮Task.Run每次创建新线程问题
{
    public partial class Form1 : Form
    {
        // 取消令牌
        private CancellationTokenSource _cts; 

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // 若已有任务运行（_cts未取消），则停止
            if (_cts != null && !_cts.IsCancellationRequested)
            {
                _cts?.Cancel(); // 发送取消信号
                // 任务结束后清理（释放资源，置空引用）
                _cts.Dispose();
                _cts= null;
                button1.Text = "开始轮询";
                return;
            }

            // 启动新任务：初始化Cts，获取令牌
            _cts = new CancellationTokenSource();
            var token = _cts.Token;
            button1.Text = "停止轮询";

            Task.Run(async () =>
            {
                while (_cts != null && !token.IsCancellationRequested) // 用令牌状态控制循环
                {
                    // 1. 采集数据（模拟）
                    string data = DateTime.Now.ToString("ss.fff");

                    // 2. 更新UI
                    this.Invoke(new Action(() => label1.Text = data));

                    // 3. 等待500ms（收到取消信号会立即中断等待）
                    try
                    {
                        await Task.Delay(500, token);
                    }
                    catch (OperationCanceledException)
                    {
                        // 捕获取消异常，退出循环
                        break;
                    }
                }
            }, token);

        }
    }
}
